package com.example.security.controller;

import com.example.security.entity.Users;
import org.springframework.security.access.prepost.PostAuthorize;
import org.springframework.security.access.prepost.PostFilter;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.ArrayList;
import java.util.List;

@RestController
@RequestMapping("/test")
public class TestController {

    @GetMapping("/hello")
    public String add(){
        return "hello security";
    }

    @GetMapping("/index")
    public String index(){
        return "hello index";
    }

    /*
       @Secured
            判断是否具有角色,有该角色后才可以访问该接口,匹配的字符串需要添加前缀"ROLE_"
            使用注解先要开启注解功能(主启动类): @EnableGlobalMethodSecurity(securedEnabled=true)
       @PreAuthorize
             进入方法前的权限验证,参数包含hasAuthority、hasAnyAuthority、hasRole、hasAnyRole均可使用
            使用注解先要开启注解功能(主启动类): @EnableGlobalMethodSecurity(prePostEnabled=true)
       @PostAuthorize
            进入方法后的权限验证,参数包含hasAuthority、hasAnyAuthority、hasRole、hasAnyRole均可使用
            在方法执行后再进行权限验证,适合验证带有返回值的权限
            使用注解先要开启注解功能(主启动类): @EnableGlobalMethodSecurity(prePostEnabled=true)
    */
    @GetMapping("/update")
    //@Secured({"ROLE_sale","ROLE_manager"})
    //@PreAuthorize("hasAnyAuthority('admin')")
    @PostAuthorize("hasAnyAuthority('admin')")
    public String update(){
        System.out.println("update....");
        return "hello update";
    }

    /*
         @PostFilter: 权限验证之后对数据进行过滤,如留下用户名是 admin1 的数据,表达式中的 filterObject 引用的是方法返回值 List 中的某一个元素
         @PreFilter: 进入控制器之前对数据进行过滤
    */
    @GetMapping("/getAll")
    @PreAuthorize("hasAuthority('admin')")
    @PostFilter("filterObject.username == 'admin1'")
    public List<Users> getAllUser(){
        ArrayList<Users> list = new ArrayList<>();
        list.add(new Users(1,"admin1","123"));
        list.add(new Users(2,"admin2","456"));
        return list;
    }

}
